From: Juergen Gross Date: Thu, 10 Feb 2011 09:02:50 +0000 (+0000) Subject: Cpupools: vcpu affinity handling X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10794 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=32e7954462cf4839deb1f268d37cc1639b16a0cc;p=xen.git Cpupools: vcpu affinity handling If a vcpu is pinned to multiple physical cpus, the pinning is not removed if all those physical cpus are removed from the cpupool. When disabling the scheduler on a cpu, the affinity mask must be checked against the cpumask of the cpupool. Signed-off-by: Juergen Gross --- diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 21509b6df1..5f192d272c 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -466,6 +466,7 @@ int cpu_disable_scheduler(unsigned int cpu) struct domain *d; struct vcpu *v; struct cpupool *c; + cpumask_t online_affinity; int ret = 0; bool_t affinity_broken; @@ -484,7 +485,8 @@ int cpu_disable_scheduler(unsigned int cpu) { vcpu_schedule_lock_irq(v); - if ( (cpus_weight(v->cpu_affinity) == 1) && + cpus_and(online_affinity, v->cpu_affinity, c->cpu_valid); + if ( cpus_empty(online_affinity) && cpu_isset(cpu, v->cpu_affinity) ) { printk("Breaking vcpu affinity for domain %d vcpu %d\n",